/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bd;
import com.db4o.*;
import com.db4o.query.Constraint;
import com.db4o.query.Query;
/**
 *
 * @author T
 */
public class consulta {
    
    
    private String filename = "granja.yap";
    private ObjectContainer db = null;
    
    public consulta(){          
    }
   
    public boolean abrirBD(){
        try{
            db = Db4oEmbedded.openFile(filename);
            System.out.println("Abierta BD");
            return true;
        }catch(Exception e){
            System.out.println("Error al abrir la BD: "+ e.getLocalizedMessage()+ " , "+ e.toString());
        }
        return false;
    }
    public boolean cerrarBD(){
        try{
            db.close();
            System.out.println("cerrada BD");
            return true;
        }catch(Exception e){
            System.out.println("Error al cerrar la BD: "+ e.getLocalizedMessage()+ " , "+ e.toString());
        }
        return false;
    }
    
    public boolean buscarUsuario(String us){
        boolean encontrado=true;
        us = us.trim();
        abrirBD();        
        Query q = db.query();
        q.constrain(usuario.class);
        q.descend("username").constrain(us);
        ObjectSet result = q.execute();
        if (result.isEmpty()){
            encontrado=false;
        }else{            
            encontrado=true;
        }
        cerrarBD();
        return encontrado;
    }
    
    public boolean buscarUsuario(String us,String pass){
        boolean encontrado=true;
        us = us.trim();
        pass = pass.trim();
        abrirBD();        
        Query q = db.query();
        q.constrain(usuario.class);
        Constraint constr = q.descend("password").constrain(pass);
        q.descend("username").constrain(us).and(constr);
        ObjectSet result = q.execute();
        if (result.isEmpty()){
            encontrado=false;
        }else{            
            encontrado=true;
        }
        cerrarBD();
        return encontrado;
    }
    
    public void registrarUsuario(String us, String pass) {
        abrirBD();
        usuario newus = new usuario(us, pass);
        db.store(newus);
        System.out.println("almacenado::: " + newus.getUsername() + "  " + newus.getPassword());
        System.out.println(newus);
        cerrarBD();
    }
    
    public boolean borrarUsuario(String us){  //elimina el usuario, devuelve true si existia           
        abrirBD();        
        Query q = db.query();
        q.constrain(usuario.class);
        q.descend("username").constrain(us);
        ObjectSet result = q.execute();
        
        if (!result.isEmpty()){
            usuario user = (usuario)result.next();
            db.delete(user);
            cerrarBD();
            return true;
        }
        cerrarBD();
        return false;    
    }
    
    public ObjectSet selectUsuarios(){
        try {
            //abrirBD(); <- debe abrirse desde donde se llame, y cerrarse
            Query q = db.query();
            q.constrain(usuario.class);
            q.descend("username");
            ObjectSet result = q.execute();
            System.out.println("encontrados usuarios:"+ String.valueOf(result.size()));
            //cerrarBD();
            return result; 
        } catch (Exception e) {
            System.out.println("error al consultar usuarios (*): " + e.getLocalizedMessage() + " , " + e.toString());
        }
        return null;
    }
    
    public usuario getUsuario(String user) { //devuelve el usuario <user>
        try {
            abrirBD();
            Query q = db.query();
            q.constrain(usuario.class);
            q.descend("username").constrain(user);
            ObjectSet result = q.execute();
            usuario retorno=null;            

            if (!result.isEmpty()) {
                retorno= (usuario) result.next();                                
            } 
            cerrarBD();
            return retorno;
        } catch (Exception e) {
            System.out.println("error al consultar usuario: " + e.getLocalizedMessage() + " , " + e.toString());
        }
        return null;
    }
    
    public boolean updateUsuario(usuario user) { //actualizar el usuario en la bd
        try {
            ObjectSet result = null;
            abrirBD();
            Query q = db.query();
            q.constrain(usuario.class);
            q.descend("username").constrain(user.getUsername());
            result = q.execute();
            usuario tmp = (usuario)result.next();
            tmp.setGranja(user.getGranja());
            
            db.store(tmp);
            cerrarBD();
            System.out.println("Se ha actualizado:");
            for(int i=0; i<25; i++){
                System.out.println("usuario:" + user+" -granja:"+i+" "+ user.getGranja().getItem(i));
            }
            return true;
        } catch (Exception e) {
            System.out.println("NO se actualizo:"+e.getLocalizedMessage()+ " , "+ e.toString());
            return false;
        }
    }
    
    public boolean addItem(String user, item it, int pos){ //agrega un item al usuario en esa posicion (0-25)
        try {
            abrirBD();
            Query q = db.query();
            q.constrain(usuario.class);
            q.descend("username").constrain(user);
            ObjectSet result = q.execute();
            
            usuario us = (usuario)result.next();            
            us.getGranja().setItem(it, pos);
            
            db.store(us);            
            cerrarBD();
            
            return true;      
            
        } catch (Exception e) {
            System.out.println("error al agregar item: " + e.getLocalizedMessage() + " , " + e.toString());
        }
        return false;
    }
    
    public item cosecharItem(String user, int pos){ //elimina el item en la pos de la granja del usuario, y lo agrega a los cosechados
        try {
            abrirBD();
            Query q = db.query();
            q.constrain(usuario.class);
            q.descend("username").constrain(user);
            ObjectSet result = q.execute();
            
            usuario us = (usuario)result.next();            
            item i = us.getGranja().cosecharItem(pos);   
            
            db.store(us);
            cerrarBD();
            
            return i;            
        } catch (Exception e) {
            System.out.println("error al agregar item: " + e.getLocalizedMessage() + " , " + e.toString());
        }
        return null;
    }
    
    public item removeItem(String user, int pos){ //elimina el item en la pos de la granja del usuario
        try {
            abrirBD();
            Query q = db.query();
            q.constrain(usuario.class);
            q.descend("username").constrain(user);
            ObjectSet result = q.execute();
            
            usuario us = (usuario)result.next();            
            item i = us.getGranja().deleteItem(pos);   
            
            db.store(us);
            cerrarBD();
            
            return i;            
        } catch (Exception e) {
            System.out.println("error al agregar item: " + e.getLocalizedMessage() + " , " + e.toString());
        }
        return null;
    }
    
    public String enviarI(String user1, String user2, int tipo, int cant) { //pedir a transporte        
        //item i = new item();
        //int tipo = 0;
        String prod = new item().QueEs(tipo);
        System.out.print("DATOS ENVIO:"+user1 +" - "+ user2+ "-producto:"+prod + "-cant:"+String.valueOf(cant)); 
        //solicitar al WS de transporte que envie <n> items <prod>, del usuario <user1> al <user2>
        //if (!tenviarItems(user1, user2, prod, cant).equals("")) {
        String retorno = "";
        retorno = enviarItems(user1,user2,prod,String.valueOf(cant));
        //retorno = enviarItems("Sofia","Pedro","tomate","7");
        System.out.println("Enviando a transporte: " + user1+user2+prod+cant);
        if(( !retorno.equals(""))&&(!retorno.equals("error"))){
            usuario us1 = this.getUsuario(user1);
            usuario us2 = this.getUsuario(user2);
            
            if ((us1 != null) && (us2 != null)) {                
                //tipo = i.QueTipoEs(prod);
                int inicial = us1.getGranja().getCantidadAlmacenado(tipo);
                
                if(inicial >= cant){ //tiene mas de lo q ofrece dar
                    
                    us1.getGranja().almacenados[tipo] -= cant;  //le quito al primero
                    us2.getGranja().almacenados[tipo] += cant;  //se lo pongo al segundo
                    System.out.print("QUEDAN:"+us1.getUsername() +"-"+us1.getGranja().getCantidadAlmacenado(tipo)
                            + " =>"+ us2.getUsername()+ "-"+us2.getGranja().getCantidadAlmacenado(tipo));
                    this.updateUsuario(us1);
                    this.updateUsuario(us2);
                    return retorno;
                }
            }
        }
        return retorno; //en la jsp se valida si es "error" o "", dependiendo si no tiene saldo o comunicacion
    }
    
    public float consultaSaldo(String user){ //preguntar al banco el saldo
        float saldo = 0;
        saldo = consultarSaldo(user);   
        //System.out.println("OTRO WS:"+ this.empresasTransporte());
        return saldo;
    }
    
    public boolean descontarSaldo(String user, float cant){ //pedir al banco que descuente
        boolean realizado = false;
        //
        return realizado;
    }
    
    public boolean aumentarSaldo(String user, float cant){ //pedir al banco que aumente
        boolean realizado = false;
        //
        return realizado;
    }

    private static Float tconsultarSaldo(java.lang.String user) {
        granjawspackage.GranjaWS_Service service = new granjawspackage.GranjaWS_Service();
        granjawspackage.GranjaWS port = service.getGranjaWSPort();
        return port.tconsultarSaldo(user);
    }

    private static String tenviarItems(java.lang.String userOrigen, java.lang.String userDestino, java.lang.String producto, int cantidad) {
        granjawspackage.GranjaWS_Service service = new granjawspackage.GranjaWS_Service();
        granjawspackage.GranjaWS port = service.getGranjaWSPort();
        return port.tenviarItems(userOrigen, userDestino, producto, cantidad);
    }

    

    private static float consultarSaldo(java.lang.String email) {
        sw.TransaccionBancoService service = new sw.TransaccionBancoService();
        sw.TransaccionBanco port = service.getTransaccionBancoPort();
        return port.consultarSaldo(email);
    }

    private static String empresasTransporte() {
        localhost.transporte.servicios.Servicios service = new localhost.transporte.servicios.Servicios();
        localhost.transporte.servicios.ServiciosSoap port = service.getServiciosSoap();
        return port.empresasTransporte();
    }

    private static String enviarItems(java.lang.String userorigen, java.lang.String userdestino, java.lang.String producto, java.lang.String cant) {
        localhost.transporte.servicios.Servicios service = new localhost.transporte.servicios.Servicios();
        localhost.transporte.servicios.ServiciosSoap port = service.getServiciosSoap();
        return port.enviarItems(userorigen, userdestino, producto, cant);
    }
    
}
